package parser;

import org.w3c.dom.*;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

/**
 * @author 石小俊
 * @date 2023年11月01日 11:20
 * DOM解析步骤
 * 创建DOM工厂
 * 通过DOM工厂获取对应的解析器
 * 进行解析
 * 根据解析后的数据进行操作
 */
public class DOMParser {

    public static void main(String[] args) {
        // 通过静态工厂创建DOM工厂实例
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        try {
            // 获取解析器
            DocumentBuilder builder = factory.newDocumentBuilder();

            // 解析文档
            Document document = builder.parse(DOMParser.class.getClassLoader().getResourceAsStream("students.xml"));

            // 获取根元素
            Element root = document.getDocumentElement();
            System.out.println(root);
            System.out.println("标签名:"+root.getTagName());

            // 根据指定属性名获取对应的属性值
            System.out.println("no属性值:"+root.getAttribute("no"));

            // 获取当前元素的所有属性
            // 此时的返回值NamedNodeMap当做List来处理即可
            NamedNodeMap attributes = root.getAttributes();
            for(int i = 0; i < attributes.getLength(); i++){
                // 取出当前迭代的选项
                Node attr = attributes.item(i);
                System.out.println(attr);
            }

            // 获取当前元素中的所有子元素
            // NodeList同样可以当做List处理
            NodeList childNodes = root.getChildNodes();
            System.out.println("子节点数量:"+childNodes.getLength());
            for(int i = 0; i < childNodes.getLength(); i++){
                Node node = childNodes.item(i);

                // 此时取到的5个节点中存在三个文本节点与两个元素节点
                // 其中三个文本节点属于空白,元素节点是student标签
                // 对于空白可以直接打印,对于元素节点仍然需要继续解析
                // 可以判断当前节点类型
                if(node.getNodeType() == Node.ELEMENT_NODE){
                    // 元素节点
                    Element ele = (Element) node;
                    System.out.println("标签名:"+ele.getTagName());
                    NamedNodeMap attrs = ele.getAttributes();
                    for(int j = 0; j < attrs.getLength(); j++){
                        System.out.println(attrs.item(j));
                    }
                    NodeList children = ele.getChildNodes();
                    System.out.println("子节点数量:"+children.getLength());
                    for(int j = 0; j < children.getLength();j++){
                        Node child = children.item(j);
                        if(child.getNodeType() == Node.ELEMENT_NODE){
                            System.out.println("name标签体:"+child.getTextContent());
                        }
                    }
                }

                if(node.getNodeType() == Node.TEXT_NODE){
                    // 文本节点
                    System.out.println("文本内容:"+node.getTextContent());
                }

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
